﻿
using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.ДокументыСсылка;
using V82.ДокументыОбъект;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.ДокументыОбъект
{
	///<summary>
	///(Регл)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class СчетФактураВыданный:ДокументОбъект
	{
		public bool _ЭтоНовый;
		public bool ЭтоНовый()
		{
			return _ЭтоНовый;
		}
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		[DataMember]
		[ProtoMember(3)]
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		[DataMember]
		[ProtoMember(4)]
		public bool ПометкаУдаления {get;set;}
		[DataMember]
		[ProtoMember(5)]
		public DateTime Дата {get;set;}
		[DataMember]
		[ProtoMember(6)]
		public DateTime ПрефиксНомера {get;set;}
		[DataMember]
		[ProtoMember(7)]
		public string/*11*/ Номер {get;set;}
		[DataMember]
		[ProtoMember(8)]
		public bool Проведен {get;set;}
		[DataMember]
		[ProtoMember(9)]
		public DateTime ДатаВыставления {get;set;}//Счет-фактура передан
		[DataMember]
		[ProtoMember(10)]
		public V82.СправочникиСсылка.Контрагенты Контрагент {get;set;}
		[DataMember]
		[ProtoMember(11)]
		public V82.СправочникиСсылка.ДоговорыКонтрагентов ДоговорКонтрагента {get;set;}//Договор контрагента
		[DataMember]
		[ProtoMember(12)]
		public V82.Перечисления/*Ссылка*/.ВидСчетаФактурыВыставленного ВидСчетаФактуры {get;set;}//Вид счета-фактуры
		[DataMember]
		[ProtoMember(13)]
		public object ДокументОснование {get;set;}//Документ основание
		[DataMember]
		[ProtoMember(14)]
		public bool Под0 {get;set;}//Аванс под 0%
		///<summary>
		///Сумма по документу основанию в валюте документа
		///</summary>
		[DataMember]
		[ProtoMember(15)]
		public decimal/*(14.2)*/ ВалютнаяСумма {get;set;}//Сумма по документу-основанию
		[DataMember]
		[ProtoMember(16)]
		public V82.Перечисления/*Ссылка*/.СтавкиНДС СтавкаНДС {get;set;}//Ставка НДС
		[DataMember]
		[ProtoMember(17)]
		public decimal/*(14.2)*/ Сумма {get;set;}
		[DataMember]
		[ProtoMember(18)]
		public decimal/*(14.2)*/ СуммаНДС {get;set;}//Сумма НДС
		[DataMember]
		[ProtoMember(19)]
		public DateTime ДатаПлатежноРасчетногоДокумента {get;set;}//Дата платежно расчетного документа
		[DataMember]
		[ProtoMember(20)]
		public string/*(30)*/ НомерПлатежноРасчетногоДокумента {get;set;}//Номер платежно расчетного документа
		[DataMember]
		[ProtoMember(21)]
		public V82.СправочникиСсылка.Валюты ВалютаДокумента {get;set;}//Валюта документа
		[DataMember]
		[ProtoMember(22)]
		public decimal/*(14.2)*/ СуммаДокумента {get;set;}//Сумма документа
		[DataMember]
		[ProtoMember(23)]
		public bool СформированПриВводеНачальныхОстатковНДС {get;set;}//Сформирован при вводе начальных остатков НДС
		[DataMember]
		[ProtoMember(24)]
		public V82.СправочникиСсылка.Пользователи Ответственный {get;set;}
		///<summary>
		///Любая дополнительная информация
		///</summary>
		[DataMember]
		[ProtoMember(25)]
		public string/*(0)*/ Комментарий {get;set;}
		[DataMember]
		[ProtoMember(26)]
		public bool Исправление {get;set;}
		[DataMember]
		[ProtoMember(27)]
		public decimal/*(1)*/ КодСпособаВыставления {get;set;}//Код способа выставления
		[DataMember]
		[ProtoMember(28)]
		public string/*(10)*/ КодВидаОперации {get;set;}//Код вида операции
		[DataMember]
		[ProtoMember(29)]
		public bool Выставлен {get;set;}
		[DataMember]
		[ProtoMember(30)]
		public decimal/*(10)*/ НомерИсправления {get;set;}//Номер исправления
		[DataMember]
		[ProtoMember(31)]
		public string/*(15)*/ НомерИсходногоДокумента {get;set;}//Номер корректируемого счета-фактуры
		[DataMember]
		[ProtoMember(32)]
		public DateTime ДатаИсходногоДокумента {get;set;}//Дата корректируемого счета-фактуры
		[DataMember]
		[ProtoMember(33)]
		public decimal/*(10)*/ НомерИсправленияИсходногоДокумента {get;set;}//Номер исправления исходного документа
		[DataMember]
		[ProtoMember(34)]
		public DateTime ДатаИсправленияИсходногоДокумента {get;set;}//Дата исправления исходного документа
		///<summary>
		///Сумма по документу основанию в валюте документа увеличение
		///</summary>
		[DataMember]
		[ProtoMember(35)]
		public decimal/*(14.2)*/ СуммаУвеличение {get;set;}//Сумма по документу-основанию увеличение
		///<summary>
		///Сумма по документу основанию в валюте документа уменьшение
		///</summary>
		[DataMember]
		[ProtoMember(36)]
		public decimal/*(14.2)*/ СуммаУменьшение {get;set;}//Сумма по документу-основанию уменьшение
		[DataMember]
		[ProtoMember(37)]
		public bool УчитыватьИсправлениеИсходногоДокумента {get;set;}//Учитывать исправление исходного документа
		[DataMember]
		[ProtoMember(38)]
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		[DataMember]
		[ProtoMember(39)]
		public string/*(15)*/ НомерИсправляемогоКорректировочногоДокумента {get;set;}//Номер исправляемого корректировочного счета-фактуры
		[DataMember]
		[ProtoMember(40)]
		public DateTime ДатаИсправляемогоКорректировочногоДокумента {get;set;}//Дата исправляемого корректировочного счета-фактуры
		[DataMember]
		[ProtoMember(41)]
		public bool СчетФактураБезНДС {get;set;}//Счет-фактура без НДС
		[DataMember]
		[ProtoMember(42)]
		public bool СчетФактураНеВыставляется {get;set;}//Счет-фактура не выставляется
		///<summary>
		///Сумма НДС по документу основанию в валюте документа увеличение
		///</summary>
		[DataMember]
		[ProtoMember(43)]
		public decimal/*(14.2)*/ СуммаНДСУвеличение {get;set;}//Сумма НДС по документу-основанию увеличение
		///<summary>
		///Сумма НДС по документу основанию в валюте документа уменьшение
		///</summary>
		[DataMember]
		[ProtoMember(44)]
		public decimal/*(14.2)*/ СуммаНДСУменьшение {get;set;}//Сумма НДС по документу-основанию уменьшение
		///<summary>
		///Сумма НДС по документу основанию в валюте документа
		///</summary>
		[DataMember]
		[ProtoMember(45)]
		public decimal/*(14.2)*/ СуммаНДСДокумента {get;set;}//Сумма НДС по документу-основанию
		[DataMember]
		[ProtoMember(46)]
		public V82.ДокументыСсылка.СчетФактураВыданный ИсправляемыйСчетФактура {get;set;}//Исправляемый счет-фактура
		[DataMember]
		[ProtoMember(47)]
		public V82.СправочникиСсылка.Контрагенты Комитент {get;set;}
		[DataMember]
		[ProtoMember(48)]
		public V82.СправочникиСсылка.ФизическиеЛица Руководитель {get;set;}
		[DataMember]
		[ProtoMember(49)]
		public V82.СправочникиСсылка.ФизическиеЛица ГлавныйБухгалтер {get;set;}//Главный бухгалтер
		public void Записать()
		{
			//Установка блокировки элемента на горизантально масштабированный кластер.
			//Опционально введение тайм аута на запись одного и того же объекта, не чаще раза в 5-секунд. Защита от спама. упращение алгоритма блокировки.
			//Выделение сервиса для блокировки элемента и генерации кода
			//Выполнение операций контроля без обращений к sql-серверу.
			//Контроль конфликта блокировок.
			//Контроль загрузки булкинсертом гетерогенной коллекции.
			//Контроль уникальности кода для Документов.
			//Контроль уникальности номера для документов, в границах префикса.
			//Контроль владельца, он не может быть группой.
			//Контроль владельца он должен быть задан.
			//Контроль родителя он должен быть группой.
			//Контроль количества уровней, должен соотвествовать метаданным.
			//Контроль версии, объект не должен был быть записан перед чтением текущей записи, алгоритм версионника.
			//Контроль уникальности ссылки
			//Контроль зацикливания
			//Опционально контроль битых ссылок.
			//Соблюдейние транзакционности. ПередЗаписью. Открытие транзации. Валидации. ПриЗаписи. Фиксация транзакции. Информирование о записи элемента.
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					if(_ЭтоНовый)
					{
						Команда.CommandText = @"
						Insert Into _Document464(
						_IDRRef
						/*,_Version*/
						,_Marked
						,_IsMetadata
						,_Number
						,_Fld27318
						,_Fld11932RRef
						,_Fld11936RRef
						,_Fld22260RRef
						,_Fld11928
						,_Fld11938
						,_Fld11929RRef
						,_Fld11930
						,_Fld11931
						,_Fld11923
						,_Fld11922
						,_Fld11933RRef
						,_Fld11934
						,_Fld11937
						,_Fld11926RRef
						,_Fld11924
						,_Fld27319
						,_Fld27320
						,_Fld27321
						,_Fld27322
						,_Fld27323
						,_Fld27324
						,_Fld27325
						,_Fld27326
						,_Fld27327
						,_Fld27328
						,_Fld27329
						,_Fld27330
						,_Fld11925RRef
						,_Fld27331
						,_Fld27332
						,_Fld27333
						,_Fld27334
						,_Fld27335
						,_Fld27336
						,_Fld27337
						,_Fld27338RRef
						,_Fld27339RRef
						,_Fld27340RRef
						,_Fld27341RRef)
						Values(
						@Ссылка
						/*,@Версия*/
						,@ПометкаУдаления
						,@Номер
						,@ДатаВыставления
						,@Контрагент
						,@ДоговорКонтрагента
						,@ВидСчетаФактуры
						,@Под0
						,@ВалютнаяСумма
						,@СтавкаНДС
						,@Сумма
						,@СуммаНДС
						,@ДатаПлатежноРасчетногоДокумента
						,@НомерПлатежноРасчетногоДокумента
						,@ВалютаДокумента
						,@СуммаДокумента
						,@СформированПриВводеНачальныхОстатковНДС
						,@Ответственный
						,@Комментарий
						,@Исправление
						,@КодСпособаВыставления
						,@КодВидаОперации
						,@Выставлен
						,@НомерИсправления
						,@НомерИсходногоДокумента
						,@ДатаИсходногоДокумента
						,@НомерИсправленияИсходногоДокумента
						,@ДатаИсправленияИсходногоДокумента
						,@СуммаУвеличение
						,@СуммаУменьшение
						,@УчитыватьИсправлениеИсходногоДокумента
						,@Организация
						,@НомерИсправляемогоКорректировочногоДокумента
						,@ДатаИсправляемогоКорректировочногоДокумента
						,@СчетФактураБезНДС
						,@СчетФактураНеВыставляется
						,@СуммаНДСУвеличение
						,@СуммаНДСУменьшение
						,@СуммаНДСДокумента
						,@ИсправляемыйСчетФактура
						,@Комитент
						,@Руководитель
						,@ГлавныйБухгалтер)";
					}
					else
					{
						Команда.CommandText = @"
						Update _Document464
						Set
						/*_IDRRef	= @Ссылка*/
						/*,_Version	= @Версия*/
						_Marked	= @ПометкаУдаления
						,_Number	= @Номер
						,_Fld27318	= @ДатаВыставления
						,_Fld11932RRef	= @Контрагент
						,_Fld11936RRef	= @ДоговорКонтрагента
						,_Fld22260RRef	= @ВидСчетаФактуры
						,_Fld11928	= @Под0
						,_Fld11938	= @ВалютнаяСумма
						,_Fld11929RRef	= @СтавкаНДС
						,_Fld11930	= @Сумма
						,_Fld11931	= @СуммаНДС
						,_Fld11923	= @ДатаПлатежноРасчетногоДокумента
						,_Fld11922	= @НомерПлатежноРасчетногоДокумента
						,_Fld11933RRef	= @ВалютаДокумента
						,_Fld11934	= @СуммаДокумента
						,_Fld11937	= @СформированПриВводеНачальныхОстатковНДС
						,_Fld11926RRef	= @Ответственный
						,_Fld11924	= @Комментарий
						,_Fld27319	= @Исправление
						,_Fld27320	= @КодСпособаВыставления
						,_Fld27321	= @КодВидаОперации
						,_Fld27322	= @Выставлен
						,_Fld27323	= @НомерИсправления
						,_Fld27324	= @НомерИсходногоДокумента
						,_Fld27325	= @ДатаИсходногоДокумента
						,_Fld27326	= @НомерИсправленияИсходногоДокумента
						,_Fld27327	= @ДатаИсправленияИсходногоДокумента
						,_Fld27328	= @СуммаУвеличение
						,_Fld27329	= @СуммаУменьшение
						,_Fld27330	= @УчитыватьИсправлениеИсходногоДокумента
						,_Fld11925RRef	= @Организация
						,_Fld27331	= @НомерИсправляемогоКорректировочногоДокумента
						,_Fld27332	= @ДатаИсправляемогоКорректировочногоДокумента
						,_Fld27333	= @СчетФактураБезНДС
						,_Fld27334	= @СчетФактураНеВыставляется
						,_Fld27335	= @СуммаНДСУвеличение
						,_Fld27336	= @СуммаНДСУменьшение
						,_Fld27337	= @СуммаНДСДокумента
						,_Fld27338RRef	= @ИсправляемыйСчетФактура
						,_Fld27339RRef	= @Комитент
						,_Fld27340RRef	= @Руководитель
						,_Fld27341RRef	= @ГлавныйБухгалтер
						Where _IDRRef = @Ссылка";
					}
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					/*Команда.Parameters.AddWithValue("Версия", Версия);*/
					Команда.Parameters.AddWithValue("ПометкаУдаления", ПометкаУдаления);
					Команда.Parameters.AddWithValue("Номер", Номер);
					Команда.Parameters.AddWithValue("ДатаВыставления", ДатаВыставления);
					Команда.Parameters.AddWithValue("ВидСчетаФактуры", ВидСчетаФактуры.Ключ());
					Команда.Parameters.AddWithValue("Под0", Под0);
					Команда.Parameters.AddWithValue("ВалютнаяСумма", ВалютнаяСумма);
					Команда.Parameters.AddWithValue("СтавкаНДС", СтавкаНДС.Ключ());
					Команда.Parameters.AddWithValue("Сумма", Сумма);
					Команда.Parameters.AddWithValue("СуммаНДС", СуммаНДС);
					Команда.Parameters.AddWithValue("ДатаПлатежноРасчетногоДокумента", ДатаПлатежноРасчетногоДокумента);
					Команда.Parameters.AddWithValue("НомерПлатежноРасчетногоДокумента", НомерПлатежноРасчетногоДокумента);
					Команда.Parameters.AddWithValue("СуммаДокумента", СуммаДокумента);
					Команда.Parameters.AddWithValue("СформированПриВводеНачальныхОстатковНДС", СформированПриВводеНачальныхОстатковНДС);
					Команда.Parameters.AddWithValue("Комментарий", Комментарий);
					Команда.Parameters.AddWithValue("Исправление", Исправление);
					Команда.Parameters.AddWithValue("КодСпособаВыставления", КодСпособаВыставления);
					Команда.Parameters.AddWithValue("КодВидаОперации", КодВидаОперации);
					Команда.Parameters.AddWithValue("Выставлен", Выставлен);
					Команда.Parameters.AddWithValue("НомерИсправления", НомерИсправления);
					Команда.Parameters.AddWithValue("НомерИсходногоДокумента", НомерИсходногоДокумента);
					Команда.Parameters.AddWithValue("ДатаИсходногоДокумента", ДатаИсходногоДокумента);
					Команда.Parameters.AddWithValue("НомерИсправленияИсходногоДокумента", НомерИсправленияИсходногоДокумента);
					Команда.Parameters.AddWithValue("ДатаИсправленияИсходногоДокумента", ДатаИсправленияИсходногоДокумента);
					Команда.Parameters.AddWithValue("СуммаУвеличение", СуммаУвеличение);
					Команда.Parameters.AddWithValue("СуммаУменьшение", СуммаУменьшение);
					Команда.Parameters.AddWithValue("УчитыватьИсправлениеИсходногоДокумента", УчитыватьИсправлениеИсходногоДокумента);
					Команда.Parameters.AddWithValue("НомерИсправляемогоКорректировочногоДокумента", НомерИсправляемогоКорректировочногоДокумента);
					Команда.Parameters.AddWithValue("ДатаИсправляемогоКорректировочногоДокумента", ДатаИсправляемогоКорректировочногоДокумента);
					Команда.Parameters.AddWithValue("СчетФактураБезНДС", СчетФактураБезНДС);
					Команда.Parameters.AddWithValue("СчетФактураНеВыставляется", СчетФактураНеВыставляется);
					Команда.Parameters.AddWithValue("СуммаНДСУвеличение", СуммаНДСУвеличение);
					Команда.Parameters.AddWithValue("СуммаНДСУменьшение", СуммаНДСУменьшение);
					Команда.Parameters.AddWithValue("СуммаНДСДокумента", СуммаНДСДокумента);
					Команда.Parameters.AddWithValue("ИсправляемыйСчетФактура", ИсправляемыйСчетФактура.Ссылка);
					Команда.ExecuteNonQuery();
				}
			}
		}
		public void Удалить()
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Delete _Document464
					Where _IDRRef=@Ссылка";
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					Команда.ExecuteNonQuery();
				}
			}
		}
	}
}